package com.demo.java.OD251_300.OD256;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【字符串重新排序】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146054706
 */
public class OdMain {
    public static void main(String[] args) {
        // 使用Scanner读取输入
        Scanner scanner = new Scanner(System.in);
        String inputStr = scanner.nextLine().trim();  // 读取输入字符串并去除首尾空白
        String[] words = inputStr.split(" ");  // 按空格分割字符串为单词数组

        // 使用HashMap存储每个单词的字母排序后的形式及其出现的频率
        Map<String, Integer> wordFreqs = new HashMap<>();
        for (String word : words) {
            // 将单词转换为字符数组并排序
            char[] chars = word.toCharArray();
            Arrays.sort(chars);
            String sortedWord = new String(chars);  // 排序后的单词
            // 更新单词频率
            wordFreqs.put(sortedWord, wordFreqs.getOrDefault(sortedWord, 0) + 1);
        }

        // 将Map中的条目转换为List，以便进行排序
        List<Map.Entry<String, Integer>> sortedFreqs = new ArrayList<>(wordFreqs.entrySet());

        // 使用自定义的比较器进行排序
        Collections.sort(sortedFreqs, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                // 先按频率降序排序
                int freqCompare = o2.getValue().compareTo(o1.getValue());
                if (freqCompare != 0) {
                    return freqCompare;
                }
                // 如果频率相同，按字母长度升序排序
                int lengthCompare = Integer.compare(o1.getKey().length(), o2.getKey().length());
                if (lengthCompare != 0) {
                    return lengthCompare;
                }
                // 如果频率和字母长度都相同，按字典顺序排序
                return o1.getKey().compareTo(o2.getKey());
            }
        });

        // 使用StringBuilder构建结果字符串
        StringBuilder res = new StringBuilder();
        for (Map.Entry<String, Integer> entry : sortedFreqs) {
            String word = entry.getKey();
            int freq = entry.getValue();
            // 根据频率添加单词
            for (int i = 0; i < freq; i++) {
                res.append(word).append(" ");
            }
        }
        // 输出结果，去掉最后的多余空格
        System.out.println(res.toString().trim());
    }
}